package cn.lyvust.shili02;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.NumberFormat;

/**
 * Description:
 * date: 2021-6-23 19:03
 *
 * @author Guo_guo
 * @since JDK 1.8
 */
public class Lkcalculator extends JFrame {
    //运算结果输入框
    private JTextField textField;
    //当前输入的数据
    private String data = "";
    //运算框里面显示的文本内容
    private String text = "";
    //判断数据应该向哪一个操作数中存储
    private boolean isLeftAvailable;
    // left, right：左右操作数,例如：a + b = c，left是a,right是b,prevOperaotor是=
    private double left, right;
    private String prevOperaotor = "";

    public static void main(String[] args) {
        Lkcalculator lkcalculator = new Lkcalculator();
    }

    public Lkcalculator() {
        this.init();
        this.setTitle("临科计算器演示程序");
        this.setSize(450, 500);
        // 禁用窗口大小调整
        this.setResizable(false);
        //设置布局，自定义
        this.setLayout(null);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }
    private void init() {
        this.setTextField();
        this.setBtn();
    }
    private void setTextField() {
        textField = new JTextField("0");
        // 设置文本狂大小位置
        textField.setBounds(20,10,400,60);
        // 设置文本框字体
        textField.setFont(new Font("黑体", Font.BOLD, 35));
        // 设置背景颜色
        textField.setBackground(new Color(230, 230, 250));
        this.add(textField);
    }
    private void setBtn() {
        // 按钮文本
        String[] arr =
                { "del",  "cls", "%",  "/",
                   "7",   "8",   "9",  "*",
                   "4",   "5",   "6",  "+",
                   "1",   "2",   "3",  "-",
                   "+/-", "0",   ".",  "=",
                };
        // 按钮
        JButton[] btnArray = new JButton[arr.length];
        // 创建面板
        JPanel panel = new JPanel();
        // 设置面板的布局方式
        panel.setBounds(20, 90, 400, 300);
        // 网格布局 五行四列
        panel.setLayout(new GridLayout(5, 4, 8, 8));
        for(int i = 0; i < btnArray.length; i++) {
            // 创建按钮
            btnArray[i] = new JButton(arr[i]);
            // 设置按钮字体
            btnArray[i].setFont(new Font("黑体", Font.CENTER_BASELINE, 20));
            // 设置按钮背景颜色
            btnArray[i].setBackground(new Color(242, 240, 235));
            // 设置 = 号的特殊颜色
            if(btnArray.length - 1 == i) {
                btnArray[i].setBackground(new Color(211, 120, 129));
            }
            // 添加事件
            int idx = i;
            // 设置鼠标监听
            btnArray[i].addMouseListener(new MouseAdapter() {
                // 点击事件
                @Override
                public void mouseClicked(MouseEvent e) {
                    // 获取按钮上的内容
                    click(btnArray[idx].getText());
                }
                // 鼠标进入组件事件
                @Override
                public void mouseEntered(MouseEvent e) {
                    btnArray[idx].setFont(new Font("黑体", Font.CENTER_BASELINE, 35));
                    btnArray[idx].setBackground(new Color(240, 255, 255));
                    btnArray[idx].setForeground(new Color(255, 99, 71));
                }
                // 鼠标离开组件事件
                @Override
                public void mouseExited(MouseEvent e) {
                    btnArray[idx].setFont(new Font("黑体", Font.CENTER_BASELINE, 20));
                    btnArray[idx].setBackground(new Color(242, 240, 235));
                    btnArray[idx].setForeground(new Color(0, 0, 0));
                }
            });
            // 按钮添加到面板
            panel.add(btnArray[i]);
        } //end for
        this.add(panel);
    } // end setBtn

    public void click(String content) {
        String operator = "";

        if("1".equals(content)) {
            data = "1";
            text += data;
            textField.setText(text);
        }else if("2".equals(content)){
            data = "2";
            text += data;
            textField.setText(text);
        }else if("3".equals(content)){
            data = "3";
            text += data;
            textField.setText(text);
        }else if("4".equals(content)){
            data = "4";
            text += data;
            textField.setText(text);
        }else if("5".equals(content)){
            data = "5";
            text += data;
            textField.setText(text);
        }else if("6".equals(content)){
            data = "6";
            text += data;
            textField.setText(text);
        }else if("7".equals(content)){
            data = "7";
            text += data;
            textField.setText(text);
        }else if("8".equals(content)){
            data = "8";
            text += data;
            textField.setText(text);
        }else if("9".equals(content)){
            data = "9";
            text += data;
            textField.setText(text);
        }else if("0".equals(content)){
            data = "0";
            text += data;
            textField.setText(text);
        }else if(".".equals(content)){
            data = ".";
            text += data;
            textField.setText(text);
        }else if("+/-".equals(content)){
            // 找不到负号，代表这是正数
            if(text.indexOf('-') < 0) {
                text = "-" + text;
            } else {  // 负数
                text = text.substring(1);
            }
            data = text;
            textField.setText(text);
        } else if("%".equals(content)){
            operator = "%";
            cal(operator);
        } else if("+".equals(content)){
            operator = "+";
            cal(operator);
        } else if("-".equals(content)){
            operator = "-";
            cal(operator);
        } else if("*".equals(content)){
            operator = "*";
            cal(operator);
        } else if("/".equals(content)){
            operator = "/";
            cal(operator);
        } else if("=".equals(content)){
            operator = "=";
            cal(operator);
        } else if ("del".equals(content)){
            if (text.length() != 0) {
                text = text.substring(0, text.length() - 1);
            }
            data = text;
            textField.setText(text);
        } else if ("cls".equals(content)){
            data = "";
            text = "";
            isLeftAvailable = false;
            textField.setText(text);
        }
    } // end click

    private void cal(String operator) {
        // 如果 data 为空，不执行任何操作
        if("".equals(data)) {
            // 用户只要输入 = ，无论前面的输入是否合法，结束此轮计算
            if("=".equals(operator)) {
                isLeftAvailable = false;
            }
            return;
        }

        /**
         * 第一次把 data 中的数据赋给 left 侧运算数
         * 此后，每次运算都将 right 与 left 运算的结果放入 left 中，并显示 left
         * 运算符 = 使用后可以重新向 left 中输入值
         * 每次获取到 data 中的值后清空 data
         *
         * 每次运算使用上一次传入的运算符，等号出现重新开始新的计算
         */

        if(isLeftAvailable) {
            right = Double.parseDouble(data);
            data = "";

            // 使用前一个运算符
            if("+".equals(prevOperaotor)) {
                left += right;
            } else if("-".equals(prevOperaotor)) {
                left -= right;
            } else if("*".equals(prevOperaotor)) {
                left *= right;
            } else if("/".equals(prevOperaotor)) {
                left /= right;
            } else if ("%".equals(prevOperaotor)) {
                left %= right;
            }

            // 如果运算结果为整数，就用整数输出
            if(left == (int)left) {
                left = (int)left;
            }
        } else {
            left = Double.parseDouble(data);
            // 清空 data
//             data = "";
            isLeftAvailable = true;
        }
        // 将运算结果转换为字符串
        String result = left + "";
        // 更新运算符
        prevOperaotor = operator;

        // "=" 操作符清理右操作数，重新开始计算
        if("=".equals(operator)) {
//            isLeftAvailable = false;
            text = textFormat(result);
        } else {
            text = textFormat(result) + " " +operator + " ";
        }
        textField.setText(text);
    } // end cal
    private String textFormat(String s) {
        //创建一个格式化数字的对象
        NumberFormat nf = NumberFormat.getInstance();
        //格式化
        String fomatResult = nf.format(Double.parseDouble(s));
        return fomatResult;
    }
}
